import type { I18n } from "vue-i18n";
// element-plus国际化
// import enLocale from "element-plus/es/locale/lang/en";
// import zhLocale from "element-plus/es/locale/lang/zh-cn";
// 多组件库的国际化和本地项目国际化兼容
import { createI18n } from "vue-i18n";
import { platformConfigsStorage } from "@/config/storage";

// 抽取本地国际化配置, 返回一个函数, 用于获取指定语言的国际化配置
const siphonI18n = (function () {
    const localI18n = import.meta.glob("../../locales/*.json", { eager: true });
    // 将对象转成数组，处理成需要的格式
    const i18nArr = Object.entries(localI18n).map(([key, value]: [string, any]) => {
        const matched = key.match(/([\w-]+)\./)![1]; // 获取文件名，约定文件名为语言标识
        return [matched, value.default]; // 返回一个元组，包含语言标识和对应的内容
    });
    // 处理完后将数组转成对象
    const cache = Object.fromEntries(i18nArr);
    return (prefix = "zh-CN") => {
        return cache[prefix];
    };
})();

// 1. 组合语言包对象
export const localesConfigs = {
    zh: {
        ...siphonI18n("zh-CN"),
        // ...zhLocale,
    },
    en: {
        ...siphonI18n("en"),
        // ...enLocale,
    },
};

const locale = platformConfigsStorage.value?.Locale ?? "zh";

// 2. 创建国际化实例
export const i18n: I18n = createI18n({
    legacy: false, // 设置为 false，启用 composition API 模式
    locale, // 默认显示的语言
    globalInjection: true, // 全局注册$t方法，默认true
    messages: localesConfigs,
    missingWarn: false, // 当找不到对应语言的内容时，是否警告
});

/**
 * 有两个版本的 $t, 一个是全局注册的 i18n.global.t, 可以直接在模板中使用
 * 一个通过导入的, 两者区别主要是对传参空值的判断
 */
export const $t: (key: string | null | undefined) => string = (key) => {
    if (!key) return "unknown";
    // 使用类型断言绕过类型检查
    return (i18n.global as any).t(key);
};
